﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TicketsPhone.Domain.Access;
using TicketsPhone.Domain.Entities;
using System.Data;
using TicketsPhone.Entidades;

namespace TicketsPhone.Domain.Access
{
    public class UsuarioRepositorio : ConexionSql<Usuario> , ICrud<Usuario>
    {
        /// <summary>
        /// Retorna un usuario de acuerdo al email y pass a un usuario administrador
        /// </summary>
        /// <param name="email">email del usuario</param>
        /// <param name="pass">clave del usuario</param>
        /// <returns>Objeto del Usuario</returns>
        public Usuario ValidarAutenticacion(string email, string pass)
        {
            Usuario us = new Usuario();
            CrearComando("spUsuario_ValidarAutenticacion");
            AgregarParametro("@email", email, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            AgregarParametro("@pass", pass, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            ExecuteReader();

            while (Read()) 
            {
                us.IdUsuario = Convert.ToInt32(GetValue("IdUsuario"));
                us.Entidad.IdEntidad = Convert.ToInt32(GetValue("IdEntidad"));
                us.Nombre = GetValue("Nombre").ToString();
                us.Apellidos = GetValue("Apellidos").ToString();
                us.Perfil.IdPerfil = GetIntValue("IdPerfil");
                us.IdSucursal = GetIntValue("IdSucursal");
                us.Email = email;
            }

            return us;
        }

        /// <summary>
        /// Retorna el listado completo de los usuarios existentes
        /// </summary>
        /// <returns>Listado de usuarios</returns>
        public List<Usuario> ObtenerTodos()
        {
            List<Usuario> listaUsuarios = new List<Usuario>();

            CrearComando("spUsuario_Obtener");
            ExecuteReader();
            
            while (Read())
            {
                Usuario usuario = new Usuario();
                usuario.IdUsuario = GetIntValue("IdUsuario");
			    usuario.Nombre = GetStringValue("Nombre");
			    usuario.Apellidos = GetStringValue("Apellidos");
                usuario.Email = GetStringValue("Email");
			    usuario.Activo = GetBooleanValue("Activo");
                usuario.Perfil.Nombre = GetStringValue("NombrePerfil");
                usuario.Entidad.Nombre = GetStringValue("NombreEntidad");
			    listaUsuarios.Add(usuario);
            }

            return listaUsuarios;
        }
 


        /// <summary>
        /// Crea un usuario y devuelve el id del usuario
        /// </summary>
        /// <returns>id del usuario creado</returns>
        public int Crear()
        {
            CrearComando("spUsuario_Crear");
            AgregarParametros();
            return Convert.ToInt32(ExecuteScalar());
        }

        /// <summary>
        /// Actualiza los datos del usuario, dependiedo de los datos que tiene seteados en el objeto
        /// </summary>
        /// <returns>true si la acutalización fué correcta</returns>
        public bool Editar()
        {
            CrearComando("spUsuario_Editar");
            AgregarParametros();
            return ExecuteNonQuery()>0;
        }

        /// <summary>
        /// Elimina un usuario dependiendo del id enviado
        /// </summary>
        /// <returns>true si se eliminó correctamente</returns>
        public bool Eliminar(int id)
        {
            CrearComando("spUsuario_Eliminar");
            AgregarParametro("@IdUsuario", id, ParameterDirection.Input, DbType.Int32);
            return ExecuteNonQuery() > 0;
        }

        /// <summary>
        /// Retorna los datos básicos del usuario de acuerdo al identificador enviado
        /// </summary>
        /// <param name="id">identificador del usuario</param>
        /// <returns>Retortna un objeto con los datos del usuario</returns>
        public Usuario Cargar(int id)
        {
            Usuario usuario = new Usuario();
            CrearComando("spUsuario_Cargar");
            AgregarParametro("@IdUsuario", id, System.Data.ParameterDirection.Input, System.Data.DbType.Int32);
            ExecuteReader();

            while (Read())
            {
                usuario = new Usuario(GetDataReader()); 
            }

            return usuario;
        }

        /// <summary>
        /// Carga los datos de un usuario por el email
        /// </summary>
        /// <param name="email">email por el qie se va buscar el usuario</param>
        /// <returns>Datos del usuario</returns>
        public Usuario Cargar(string email)
        {
            List<Usuario> listaUsuarios = new List<Usuario>();

            CrearComando("spUsuario_Cargar");
            AgregarParametro("@Email", email, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            ExecuteReader();

            Usuario usuario = new Usuario();

            while (Read())
            {
                usuario = new Usuario(GetDataReader()); 
            }

            return usuario;
        }

        /// <summary>
        /// Consulta el número de la caja actual que se encuentra atendiendo el usuario
        /// </summary>
        /// <param name="idUsuario">id del usuario a consultar</param>
        /// <returns>caja actual del usuario</returns>
        public int ObtenerCajaActual(int idUsuario)
        {
            int caja = 0;

            CrearComando("spUsuario_ObtenerCajaActual");
            AgregarParametro("@idUsuario", idUsuario, System.Data.ParameterDirection.Input, System.Data.DbType.String);
            ExecuteReader();

            Usuario usuario = new Usuario();

            while (Read())
            {
                caja = GetIntValue("CajaActual");
            }

            return caja;
        }

        /// <summary>
        /// Actualiza el valor del numero de la caja actual de un usuario
        /// </summary>
        /// <param name="idUsuario">id del usuario </param>
        /// <param name="cajaActual">numero de la caja que se desea actualizar</param>
        /// <returns>true, se actualizó correctamente</returns>
        public bool EditarCajaActual(int idUsuario, int cajaActual)
        {
            CrearComando("spUsuario_EditarCajaActual");
            AgregarParametro("@idUsuario", idUsuario, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@cajaActual", cajaActual, ParameterDirection.Input, DbType.Int32);
            return ExecuteNonQuery() > 0;
        }

        public List<Usuario> Filtrar()
        {
            List<Usuario> listaUsuarios = new List<Usuario>();

            CrearComando("spUsuario_Filtrar");
            AgregarParametro("@Email", Objeto.Email, ParameterDirection.Input, DbType.String);
            ExecuteReader();

            while (Read())
            {
                Usuario usuario = new Usuario();
                usuario.IdUsuario = GetIntValue("IdUsuario");
                usuario.Nombre = GetStringValue("Nombre");
                usuario.Apellidos = GetStringValue("Apellidos");
                usuario.Email = GetStringValue("Email");
                usuario.Activo = GetBooleanValue("Activo");
                usuario.Perfil.Nombre = GetStringValue("NombrePerfil");
                usuario.Entidad.Nombre = GetStringValue("NombreEntidad");
                listaUsuarios.Add(usuario);
            }

            return listaUsuarios;
        }

        public void AgregarParametros()
        {
            AgregarParametro("@IdUsuario", Objeto.IdUsuario, ParameterDirection.InputOutput, DbType.Int32);
            AgregarParametro("@Nombre", Objeto.Nombre, ParameterDirection.Input, DbType.String);
            AgregarParametro("@Apellidos", Objeto.Apellidos, ParameterDirection.Input, DbType.String);
            AgregarParametro("@IdPerfil", Objeto.Perfil.IdPerfil, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@Activo", Objeto.Activo, ParameterDirection.Input, DbType.Boolean);
            AgregarParametro("@IdEntidad", Objeto.Entidad.IdEntidad, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@IdSucursal", Objeto.IdSucursal, ParameterDirection.Input, DbType.Int32);
            AgregarParametro("@FechaRegistro", Objeto.FechaRegistro, ParameterDirection.Input, DbType.DateTime);
            AgregarParametro("@Email", Objeto.Email, ParameterDirection.Input, DbType.String);
            AgregarParametro("@Pass", Objeto.Pass, ParameterDirection.Input, DbType.String);
            AgregarParametro("@EsAdministrador", Objeto.EsAdministrador, ParameterDirection.Input, DbType.Boolean);
        }



        

    }
}
